<?php

/**
 * QPHP
 *
 * Copyright (c) 2022 QPHP
 *
 * @author lbnnbs
 * @copyright Copyright (c) 2022 lbnnbs QPHP (https://gitee.com/lbnnbs/qphp)
 * @license AGPLv3 License
 *
 * Cookie操作
 */
class Cookie {
    
    /**
     * 防止类实例化或被复制
     *
     */
    private function __construct() {
    
    }
    
    private function __clone() {
    
    }
    
    /**
     * 获得 COOKIE 数据
     *
     * @param string $name:域名称,如果为空则返回整个 $COOKIE 数组
     * @param bool $decode:是否使用base64自动解码,如果 set() 时编码了则这里必需要编码,并且编码只能针对单个值
     * @return mixed
     */
    static public function get($name = '', $decode = false) {
        $value = $name ? (isset($_COOKIE[$name]) ? $_COOKIE[$name] : null) : $_COOKIE;
        return ($name && $decode) ? self::_decode($value) : $value;
    }
    
    /**
     * 设置COOKIE
     *
     * @param string $name :COOKIE名称
     * @param string $value :值
     * @param int $time :有效时间,以秒为单位  0:表示会话期间内
     * @param string $domain :域名
     * @param bool $encode :是否使用base64编码
     */
    static public function set($name, $value = '', $time = 0, $domain = null, $encode = false) {
        $time = ($time === 0) ? 0 : (time() + $time);
        $value = $encode ? self::_encode($value) : $value;
        return setcookie($name, $value, $time, '/', $domain);
    }
    
    /**
     * 删除 COOKIE
     *
     * @param string $name :COOKIE名称
     */
    static public function remove($name) {
        self::set($name, '', -86400 * 365);
    }
    
    /**
     * 清除 COOKIE
     */
    static public function clear() {
        foreach ($_COOKIE as $key => $val) {
            self::remove($key);
        }
    }
    
    /**
     * 私有方法：编码 COOKIE 数据
     */
    static private function _encode($str) {
        $str = base64_encode($str);
        $search = array('=', '+', '/');
        $replace = array('_', '-', '|');
        return str_replace($search, $replace, $str);
    }
    
    /**
     * 私有方法：解码 COOKIE 数据
     */
    static private function _decode($str) {
        $replace = array('=', '+', '/');
        $search = array('_', '-', '|');
        $str = str_replace($search, $replace, $str);
        return base64_decode($str);
    }
    
}
